/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package myftp.core.action;

import java.util.HashMap;
import myftp.core.controller.ActionController;
import myftp.core.model.AbstractModel;
import myftp.core.view.AbstractView;

/**
 *
 * @author CAVARLE Glenn, LUCAS Stéphane
 *
 * classe abstraite étendue par toutes les actions
 * définition du comportement d'une action
 */
public abstract class AbstractAction extends Thread implements Runnable,IAction {

    /**
     * ActionController lié à l'action
     * @var controller
     */
    private ActionController controller = null;
    /**
     * AbstractModel lié au modèle
     * @var model
     */
    private AbstractModel model = null;
    /**
     * AbstractView lié au modèle
     * @var view
     */
    private AbstractView view = null;
    /**
     * HashMap des paramêtres passés à l'action par le controller
     * @var params
     */
    private HashMap<String, Object> params = new HashMap();

    /**
     * setter pour var controller
     * @param controller
     */
    public void setController(ActionController controller) {
        this.controller = controller;
    }

    /**
     * getter pour var controller
     * @return
     */
    public ActionController getController() {
        return this.controller;
    }

    /**
     * setter pour var model
     * @param model
     */
    public void setModel(AbstractModel model) {
        this.model = model;
    }

    /**
     * getter pour var model
     * @return AbstractModel
     */
    public AbstractModel getModel() {
        return this.model;
    }

    /**
     * setter pour var view
     * @param view
     */
    public void setView(AbstractView view) {
        this.view = view;
    }

    /**
     * getter pour var view
     * @return AbstractView
     */
    public AbstractView getView() {
        return this.view;
    }

    /**
     * méthode à définir pour une action runnable
     */
    public abstract void run();

    /**
     * méthode d'initialisation des attributs obligatoires avant de lancer init()
     * (méthode appelée par le controller)
     * @param controller
     * @param model
     * @return boolean
     */
    public boolean configure(ActionController controller, AbstractModel model) {
        this.setController(controller);
        this.setModel(model);
        this.setView(controller.getView());
        return this.init();
    }

    /**
     * setter pour HashMap params
     * @param params
     */
    public void setParams(HashMap<String, Object> params) {
        this.params = params;
    }

    /**
     * setter pour ajouter un parametre à HashMap params
     * @param key
     * @param params
     */
    public void setParam(String key, Object params) {
        this.params.put(key, params);
    }

    /**
     * getter pour HashMap params
     * @return HashMap
     */
    public HashMap getParams() {
        return this.params;
    }

    /**
     * getter pour un parametre de HashMap params
     * @param key
     * @return
     */
    public Object getParam(String key) {
        if (!this.params.containsKey(key)) {
            return null;
        }
        return this.params.get(key);
    }

    /**
     * méthode d'initialisation à définir pour chaque action
     * @return boolean
     */
    public abstract boolean init();
}
